Make win32 backend build and minimally work
authorAlexander Larsson <alexl@redhat.com>
Wed, 1 Jul 2009 08:26:37 +0000 (10:26 +0200)
committerAlexander Larsson <alexl@redhat.com>
Wed, 1 Jul 2009 08:28:06 +0000 (10:28 +0200)
gdk/win32/gdkevents-win32.c
gdk/win32/gdkinput-win32.h
gdk/win32/gdkwindow-win32.c
tests/testwindows.c

index 67217e34e786a83fd3bab29dda009b5903236c76..c919f60b8e460aac93e972f795afeb12d4ba639a 100644 (file)
@@ -127,7 +127,7 @@ static GSourceFuncs event_funcs = {
 
 GPollFD event_poll_fd;
 
-static GdkWindow *current_window = NULL;
+static GdkWindow *current_toplevel = NULL;
 static gint current_x, current_y;
 static gint current_root_x, current_root_y;
 static UINT client_message;
@@ -477,36 +477,16 @@ event_mask_string (GdkEventMask mask)
 }
 
 GdkGrabStatus
-gdk_pointer_grab (GdkWindow    *window,
-                 gboolean      owner_events,
-                 GdkEventMask  event_mask,
-                 GdkWindow    *confine_to,
-                 GdkCursor    *cursor,
-                 guint32       time)
-{
-  GdkWindow *native;
-
-  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
-  g_return_val_if_fail (confine_to == NULL || GDK_IS_WINDOW (confine_to), 0);
-
-  native = gdk_window_get_toplevel (window);
-
-  if (!GDK_IS_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (native)->impl))
-    return GDK_GRAB_SUCCESS;
-
-  if (!_gdk_window_has_impl (window) &&
-      !gdk_window_is_viewable (window))
-    return GDK_GRAB_NOT_VIEWABLE;
-
-  _gdk_display_add_pointer_grab (_gdk_display,
-                                window,
-                                native,
-                                owner_events,
-                                event_mask,
-                                0,
-                                time,
-                                FALSE);
-
+_gdk_windowing_pointer_grab (GdkWindow    *window,
+                            GdkWindow    *native_window,
+                            gboolean   owner_events,
+                            GdkEventMask       event_mask,
+                            GdkWindow    *confine_to,
+                            GdkCursor    *cursor,
+                            guint32    time)
+{
+  SetCapture (GDK_WINDOW_HWND (native_window));
+  /* TODO_CSW: grab brokens, confine window, cursor, input_grab */
   return GDK_GRAB_SUCCESS;
 }
 
@@ -518,61 +498,13 @@ gdk_display_pointer_ungrab (GdkDisplay *display,
 
   info = _gdk_display_get_last_pointer_grab (display);
   if (info)
-    info->serial_end = 0;
-
-  _gdk_display_pointer_grab_update (display, 0);
-}
-
-static GdkWindow *
-find_real_window_for_grabbed_mouse_event (GdkWindow* reported_window,
-                                         MSG*       msg)
-{
-  HWND hwnd;
-  POINTS points;
-  POINT pt;
-  GdkWindow* other_window = NULL;
-
-  points = MAKEPOINTS (msg->lParam);
-  pt.x = points.x;
-  pt.y = points.y;
-  ClientToScreen (msg->hwnd, &pt);
-
-  hwnd = WindowFromPoint (pt);
-
-  if (hwnd != NULL)
     {
-      RECT rect;
-
-      GetClientRect (hwnd, &rect);
-      ScreenToClient (hwnd, &pt);
-      if (!PtInRect (&rect, pt))
-       {
-         g_print ("find_real_window_for_grabbed_mouse_event(), PtInRect() failed\n");
-         return _gdk_root;
-       }
-
-      other_window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
-    }
-
-  if (other_window == NULL)
-    {
-      g_print ("find_real_window_for_grabbed_mouse_event(), other_window == NULL\n");
-      return _gdk_root;
+      info->serial_end = 0;
+      ReleaseCapture ();
     }
+  /* TODO_CSW: cursor, confines, etc */
 
-  return other_window;
-}
-
-static GdkWindow* 
-find_window_for_mouse_event (GdkWindow* reported_window,
-                            MSG*       msg)
-{
-  GdkPointerGrabInfo *info = _gdk_display_get_last_pointer_grab (_gdk_display);
-
-  if (!info || !info->window || !info->owner_events)
-    return reported_window;
-  else
-    return find_real_window_for_grabbed_mouse_event (reported_window, msg);
+  _gdk_display_pointer_grab_update (display, 0);
 }
 
 GdkGrabStatus
@@ -975,8 +907,11 @@ fixup_event (GdkEvent *event)
 static void
 append_event (GdkEvent *event)
 {
+  GList *link;
+  
   fixup_event (event);
-  _gdk_event_queue_append (_gdk_display, event);
+  link = _gdk_event_queue_append (_gdk_display, event);
+  _gdk_windowing_got_event (_gdk_display, link, event, 0);
   GDK_NOTE (EVENTS, print_event (event));
 }
 
@@ -1200,18 +1135,20 @@ synthesize_enter_or_leave_event (GdkWindow      *window,
                                 MSG            *msg,
                                 GdkEventType    type,
                                 GdkCrossingMode mode,
-                                GdkNotifyType detail,
-                                gint            x,
-                                gint            y)
+                                GdkNotifyType detail)
 {
   GdkEvent *event;
+  POINT pt;
+
+  pt = msg->pt;
+  ScreenToClient (GDK_WINDOW_HWND (window), &pt);
   
   event = gdk_event_new (type);
   event->crossing.window = window;
   event->crossing.subwindow = NULL;
   event->crossing.time = _gdk_win32_get_next_tick (msg->time);
-  event->crossing.x = x;
-  event->crossing.y = y;
+  event->crossing.x = pt.x;
+  event->crossing.y = pt.y;
   event->crossing.x_root = msg->pt.x + _gdk_offset_x;
   event->crossing.y_root = msg->pt.y + _gdk_offset_y;
   event->crossing.mode = mode;
@@ -1225,182 +1162,7 @@ synthesize_enter_or_leave_event (GdkWindow      *window,
       ((GdkWindowObject *) window)->extension_events != 0)
     _gdk_input_enter_event (window);
 }
-
-static void
-synthesize_leave_event (GdkWindow      *window,
-                       MSG            *msg,
-                       GdkCrossingMode mode,
-                       GdkNotifyType   detail)
-{
-  POINT pt;
-  GdkPointerGrabInfo *grab;
-
-  grab = _gdk_display_get_last_pointer_grab (_gdk_display);
-
-  if (grab && grab->window != NULL && !grab->owner_events && !(grab->event_mask & GDK_LEAVE_NOTIFY_MASK))
-    return;
-
-  if (!(((GdkWindowObject *) window)->event_mask & GDK_LEAVE_NOTIFY_MASK))
-    return;
-
-  /* Leave events are at (current_x,current_y) in current_window */
-
-  if (current_window != window)
-    {
-      pt.x = current_x;
-      pt.y = current_y;
-      ClientToScreen (GDK_WINDOW_HWND (current_window), &pt);
-      ScreenToClient (GDK_WINDOW_HWND (window), &pt);
-      synthesize_enter_or_leave_event (window, msg, GDK_LEAVE_NOTIFY, mode, detail, pt.x, pt.y);
-    }
-  else
-    synthesize_enter_or_leave_event (window, msg, GDK_LEAVE_NOTIFY, mode, detail, current_x, current_y);
-
-  /* This would only make sense if the WM_MOUSEMOVE messages would come
-   * before the respective WM_MOUSELEAVE message, which apparently they
-   * do not.
-  track_mouse_event (TME_CANCEL, msg->hwnd);
-   */
-}
-  
-static void
-synthesize_enter_event (GdkWindow      *window,
-                       MSG            *msg,
-                       GdkCrossingMode mode,
-                       GdkNotifyType   detail)
-{
-  POINT pt;
-  GdkPointerGrabInfo *grab;
-
-  grab = _gdk_display_get_last_pointer_grab (_gdk_display);
-
-  if (grab && grab->window != NULL && !grab->owner_events && !(grab->event_mask & GDK_ENTER_NOTIFY_MASK))
-    return;
-
-  if (!(((GdkWindowObject *) window)->event_mask & GDK_ENTER_NOTIFY_MASK))
-    return;
-
-  /* Enter events are at GET_X_LPARAM (msg->lParam), GET_Y_LPARAM
-   * (msg->lParam) in msg->hwnd
-   */
-
-  pt.x = GET_X_LPARAM (msg->lParam);
-  pt.y = GET_Y_LPARAM (msg->lParam);
-  if (msg->hwnd != GDK_WINDOW_HWND (window))
-    {
-      ClientToScreen (msg->hwnd, &pt);
-      ScreenToClient (GDK_WINDOW_HWND (window), &pt);
-    }
-  synthesize_enter_or_leave_event (window, msg, GDK_ENTER_NOTIFY, mode, detail, pt.x, pt.y);
-
-  track_mouse_event (TME_LEAVE, GDK_WINDOW_HWND (window));
-}
-  
-static void
-synthesize_enter_events (GdkWindow      *from,
-                        GdkWindow      *to,
-                        MSG            *msg,
-                        GdkCrossingMode mode,
-                        GdkNotifyType   detail)
-{
-  GdkWindow *prev = gdk_window_get_parent (to);
-  
-  if (prev != from)
-    synthesize_enter_events (from, prev, msg, mode, detail);
-
-  synthesize_enter_event (to, msg, mode, detail);
-}
-                        
-static void
-synthesize_leave_events (GdkWindow     *from,
-                        GdkWindow      *to,
-                        MSG            *msg,
-                        GdkCrossingMode mode,
-                        GdkNotifyType   detail)
-{
-  GdkWindow *next = gdk_window_get_parent (from);
-  
-  synthesize_leave_event (from, msg, mode, detail);
-
-  if (next != to)
-    synthesize_leave_events (next, to, msg, mode, detail);
-}
                         
-static void
-synthesize_crossing_events (GdkWindow      *window,
-                           GdkCrossingMode mode,
-                           MSG            *msg)
-{
-  GdkWindow *intermediate, *tem, *common_ancestor;
-
-  if (gdk_window_is_ancestor (current_window, window))
-    {
-      /* Pointer has moved to an inferior window. */
-      synthesize_leave_event (current_window, msg, mode, GDK_NOTIFY_INFERIOR);
-      
-      /* If there are intermediate windows, generate ENTER_NOTIFY
-       * events for them
-       */
-      intermediate = gdk_window_get_parent (window);
-      if (intermediate != current_window)
-       {
-         synthesize_enter_events (current_window, intermediate, msg, mode, GDK_NOTIFY_VIRTUAL);
-       }
-      
-      synthesize_enter_event (window, msg, mode, GDK_NOTIFY_ANCESTOR);
-    }
-  else if (gdk_window_is_ancestor (window, current_window))
-    {
-      /* Pointer has moved to an ancestor window. */
-      synthesize_leave_event (current_window, msg, mode, GDK_NOTIFY_ANCESTOR);
-      
-      /* If there are intermediate windows, generate LEAVE_NOTIFY
-       * events for them
-       */
-      intermediate = gdk_window_get_parent (current_window);
-      if (intermediate != window)
-       {
-         synthesize_leave_events (intermediate, window, msg, mode, GDK_NOTIFY_VIRTUAL);
-       }
-
-      synthesize_enter_event (window, msg, mode, GDK_NOTIFY_INFERIOR);
-    }
-  else if (current_window)
-    {
-      /* Find least common ancestor of current_window and window */
-      tem = current_window;
-      do {
-       common_ancestor = gdk_window_get_parent (tem);
-       tem = common_ancestor;
-      } while (common_ancestor &&
-              !gdk_window_is_ancestor (common_ancestor, window));
-      if (common_ancestor)
-       {
-         synthesize_leave_event (current_window, msg, mode, GDK_NOTIFY_NONLINEAR);
-         intermediate = gdk_window_get_parent (current_window);
-         if (intermediate != common_ancestor)
-           {
-             synthesize_leave_events (intermediate, common_ancestor,
-                                      msg, mode, GDK_NOTIFY_NONLINEAR_VIRTUAL);
-           }
-         intermediate = gdk_window_get_parent (window);
-         if (intermediate != common_ancestor)
-           {
-             synthesize_enter_events (common_ancestor, intermediate,
-                                      msg, mode, GDK_NOTIFY_NONLINEAR_VIRTUAL);
-           }
-         synthesize_enter_event (window, msg, mode, GDK_NOTIFY_NONLINEAR);
-       }
-    }
-  else
-    {
-      /* Dunno where we are coming from */
-      synthesize_enter_event (window, msg, mode, GDK_NOTIFY_UNKNOWN);
-    }
-
-  assign_object (&current_window, window);
-}
-
 static void
 synthesize_expose_events (GdkWindow *window)
 {
@@ -1917,15 +1679,12 @@ static void
 generate_button_event (GdkEventType type,
                       gint         button,
                       GdkWindow   *window,
-                      GdkWindow   *orig_window,
                       MSG         *msg)
 {
   GdkEvent *event = gdk_event_new (type);
 
   event->button.window = window;
   event->button.time = _gdk_win32_get_next_tick (msg->time);
-  if (window != orig_window)
-    translate_mouse_coords (orig_window, window, msg);
   event->button.x = current_x = (gint16) GET_X_LPARAM (msg->lParam);
   event->button.y = current_y = (gint16) GET_Y_LPARAM (msg->lParam);
   event->button.x_root = msg->pt.x + _gdk_offset_x;
@@ -1936,9 +1695,6 @@ generate_button_event (GdkEventType type,
   event->button.device = _gdk_display->core_pointer;
 
   append_event (event);
-
-  if (type == GDK_BUTTON_PRESS)
-    _gdk_event_button_generate (_gdk_display, event);
 }
 
 static void
@@ -2102,7 +1858,7 @@ gdk_event_translate (MSG  *msg,
   GdkWindow *window = NULL;
   GdkWindowImplWin32 *impl;
 
-  GdkWindow *orig_window, *new_window;
+  GdkWindow *orig_window, *new_window, *toplevel;
 
   GdkPointerGrabInfo *grab = NULL;
   GdkWindow *grab_window = NULL;
@@ -2480,57 +2236,11 @@ gdk_event_translate (MSG  *msg,
                g_print (" (%d,%d)",
                         GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
 
-      assign_object (&window, find_window_for_mouse_event (window, msg));
-
-      grab = _gdk_display_get_last_pointer_grab (_gdk_display);
-      if (grab)
-       {
-         grab_window = grab->window;
-         grab_mask = grab->event_mask;
-         grab_owner_events = grab->owner_events;
-       }
-
-      if (grab_window != NULL)
-       {
-         GdkWindow *real_window = find_real_window_for_grabbed_mouse_event (window, msg);
-
-         if (real_window != current_window)
-           {
-             synthesize_crossing_events (real_window, GDK_CROSSING_NORMAL, msg);
-           }
-       }
-      else
-       {
-         if (window != current_window)
-           {
-             synthesize_crossing_events (window, GDK_CROSSING_NORMAL, msg);
-           }
-       }
-
-      if (!propagate (&window, msg, grab_window, grab_owner_events, grab_mask,
-                     doesnt_want_button_press, TRUE))
-       break;
-
       if (GDK_WINDOW_DESTROYED (window))
        break;
 
-      /* Emulate X11's automatic active grab */
-      /*     XXX: Do we still want this with CSW? -- Cody */
-      if (!grab_window)
-       {
-         /* No explicit active grab, let's start one automatically */
-         GDK_NOTE (EVENTS, g_print (" (automatic grab)"));
-         gdk_pointer_grab (window,
-                           FALSE,
-                           ((GdkWindowObject *) window)->event_mask,
-                           NULL, NULL, 0);
-         p_grab_automatic = TRUE;
-       }
-
-      g_print ("generate_button_event()\n");
-
       generate_button_event (GDK_BUTTON_PRESS, button,
-                            window, orig_window, msg);
+                            window, msg);
 
       return_val = TRUE;
       break;
@@ -2558,29 +2268,6 @@ gdk_event_translate (MSG  *msg,
                g_print (" (%d,%d)",
                         GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
 
-      assign_object (&window, find_window_for_mouse_event (window, msg));
-
-      grab = _gdk_display_get_last_pointer_grab (_gdk_display);
-      if (grab != NULL)
-       {
-         grab_window = grab->window;
-         grab_owner_events = grab->owner_events;
-         grab_mask = grab->event_mask;
-       }
-
-      if (grab_window != NULL)
-       {
-         GdkWindow *real_window = find_real_window_for_grabbed_mouse_event (window, msg);
-
-         if (real_window != current_window)
-           synthesize_crossing_events (real_window, GDK_CROSSING_NORMAL, msg);
-       }
-      else
-       {
-         if (window != current_window)
-           synthesize_crossing_events (window, GDK_CROSSING_NORMAL, msg);
-       }
-
 #if 0
       if (((GdkWindowObject *) window)->extension_events != 0 &&
          _gdk_input_ignore_core)
@@ -2590,21 +2277,8 @@ gdk_event_translate (MSG  *msg,
        }
 #endif
 
-      if (!propagate (&window, msg, grab_window, grab_owner_events,
-                     grab_mask, doesnt_want_button_release, TRUE))
-       {
-       }
-      else if (!GDK_WINDOW_DESTROYED (window))
-       {
-         generate_button_event (GDK_BUTTON_RELEASE, button,
-                                window, orig_window, msg);
-       }
-
-      if (grab_window != NULL && p_grab_automatic &&
-         (msg->wParam && (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) == 0)
-       {
-         gdk_pointer_ungrab (0);
-       }
+      generate_button_event (GDK_BUTTON_RELEASE, button,
+                            window, msg);
 
       return_val = TRUE;
       break;
@@ -2615,6 +2289,18 @@ gdk_event_translate (MSG  *msg,
                         (gpointer) msg->wParam,
                         GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
 
+      toplevel = gdk_window_get_toplevel (window);
+      if (current_toplevel != toplevel)
+       {
+         if (current_toplevel)
+           synthesize_enter_or_leave_event (current_toplevel, msg, 
+                                            GDK_LEAVE_NOTIFY, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR);
+         synthesize_enter_or_leave_event (toplevel, msg, 
+                                          GDK_ENTER_NOTIFY, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR);
+         assign_object (&current_toplevel, toplevel);
+         track_mouse_event (TME_LEAVE, GDK_WINDOW_HWND (toplevel));
+       }
+      
       /* If we haven't moved, don't create any GDK event. Windows
        * sends WM_MOUSEMOVE messages after a new window is shows under
        * the mouse, even if the mouse hasn't moved. This disturbs gtk.
@@ -2626,65 +2312,6 @@ gdk_event_translate (MSG  *msg,
       current_root_x = msg->pt.x + _gdk_offset_x;
       current_root_y = msg->pt.y + _gdk_offset_y;
 
-      assign_object (&window, find_window_for_mouse_event (window, msg));
-
-      if (window != current_window)
-       synthesize_crossing_events (window, GDK_CROSSING_NORMAL, msg);
-
-      GdkPointerGrabInfo *grab = _gdk_display_get_last_pointer_grab (_gdk_display);
-      if (grab != NULL)
-       {
-         grab_window = grab->window;
-         grab_owner_events = grab->owner_events;
-         grab_mask = grab->event_mask;
-       }
-
-      if (grab_window != NULL)
-       {
-         GdkWindow *real_window = find_real_window_for_grabbed_mouse_event (window, msg);
-
-         if (real_window != current_window)
-           {
-             if (grab_owner_events)
-               {
-                 synthesize_crossing_events (real_window, GDK_CROSSING_NORMAL, msg);
-               }
-             else if (current_window == grab_window)
-               {
-                 synthesize_leave_event (grab_window, msg, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR);
-                 assign_object (&current_window, _gdk_root);
-               }
-             else if (real_window == grab_window)
-               {
-                 synthesize_enter_event (grab_window, msg, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR);
-                 assign_object (&current_window, grab_window);
-               }
-           }
-       }
-      else
-       {
-         if (window != current_window)
-           {
-             synthesize_crossing_events (window, GDK_CROSSING_NORMAL, msg);
-           }
-       }
-
-#if 0   // XXX - this seems to always block us from creating motion notify events -- Cody
-      if (!propagate (&window, msg, grab_window, grab_owner_events, grab_mask,
-                     doesnt_want_button_motion, TRUE))
-       {
-         break;
-       }
-#endif
-
-      if (GDK_WINDOW_DESTROYED (window))
-       break;
-
-      if (window != orig_window)
-       {
-         translate_mouse_coords (orig_window, window, msg);
-       }
-
       event = gdk_event_new (GDK_MOTION_NOTIFY);
       event->motion.window = window;
       event->motion.time = _gdk_win32_get_next_tick (msg->time);
@@ -2706,11 +2333,6 @@ gdk_event_translate (MSG  *msg,
       GDK_NOTE (EVENTS,
                g_print (" (%d,%d)",
                         GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
-      if (current_window != NULL &&
-         (((GdkWindowObject *) current_window)->event_mask & GDK_LEAVE_NOTIFY_MASK))
-       {
-         synthesize_crossing_events (_gdk_root, GDK_CROSSING_NORMAL, msg);
-       }
 
       break;
 
@@ -2720,23 +2342,17 @@ gdk_event_translate (MSG  *msg,
 
       if (!gdk_win32_handle_table_lookup ((GdkNativeWindow) WindowFromPoint (msg->pt)))
        {
-         GdkNotifyType detail;
-
-         if (GDK_WINDOW_TYPE (current_window) != GDK_WINDOW_CHILD)
-           detail = GDK_NOTIFY_ANCESTOR;
-         else
-           detail = GDK_NOTIFY_UNKNOWN;
-
          /* we are only interested if we don't know the new window */
-         synthesize_enter_or_leave_event (current_window, msg, 
-                                          GDK_LEAVE_NOTIFY, GDK_CROSSING_NORMAL, detail,
-                                          current_x, current_y);
-         assign_object (&current_window, _gdk_root);
+         if (current_toplevel)
+           synthesize_enter_or_leave_event (current_toplevel, msg, 
+                                            GDK_LEAVE_NOTIFY, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR);
+         assign_object (&current_toplevel, NULL);
        }
       else
        {
          GDK_NOTE (EVENTS, g_print (" (ignored)"));
        }
+      
       return_val = TRUE;
       break;
 
@@ -2763,24 +2379,6 @@ gdk_event_translate (MSG  *msg,
          assign_object (&window, new_window);
        }
 
-      grab = _gdk_display_get_last_pointer_grab (_gdk_display);
-      if (grab != NULL)
-       {
-         grab_window = grab->window;
-         grab_mask = grab->event_mask;
-         grab_owner_events = grab->owner_events;
-       }
-
-      if (!propagate (&window, msg, grab_window,
-                     grab_owner_events,
-                     grab_mask,
-                     doesnt_want_scroll,
-                     TRUE))
-       break;
-
-      if (GDK_WINDOW_DESTROYED (window))
-       break;
-
       ScreenToClient (msg->hwnd, &point);
 
       event = gdk_event_new (GDK_SCROLL);
@@ -2939,6 +2537,7 @@ gdk_event_translate (MSG  *msg,
       GDK_NOTE (EVENTS, g_print (" %#x %#x",
                                 LOWORD (msg->lParam), HIWORD (msg->lParam)));
 
+#ifdef TODO_CSW
       grab = _gdk_display_get_last_pointer_grab (_gdk_display);
       if (grab != NULL)
        {
@@ -2962,6 +2561,8 @@ gdk_event_translate (MSG  *msg,
          return_val = TRUE;
          *ret_valp = TRUE;
        }
+#endif
+      
       break;
 
     case WM_SHOWWINDOW:
@@ -3480,9 +3081,6 @@ gdk_event_translate (MSG  *msg,
       break;
 
     case WM_DESTROY:
-      if (window == current_window)
-       assign_object (&current_window, _gdk_root);
-
       grab = _gdk_display_get_last_pointer_grab (_gdk_display);
       if (grab != NULL)
        {
index 1f402adad85759cde84ed8391f7d5523a6f0cd86..3d168e102feed2793b66511935596a5008970ed5 100644 (file)
@@ -32,7 +32,6 @@
 
 typedef struct _GdkAxisInfo    GdkAxisInfo;
 typedef struct _GdkDevicePrivate GdkDevicePrivate;
-typedef struct _GdkInputWindow GdkInputWindow;
 
 /* information about a device axis */
 struct _GdkAxisInfo
index d220da1878832c63fd1ef9cd079e811e1ea56d57..96f89e8358d43c6106c4b413b489b2973f38f7af 100644 (file)
@@ -972,7 +972,7 @@ show_window_internal (GdkWindow *window,
   GDK_NOTE (MISC, g_print ("show_window_internal: %p: %s%s%s\n",
                           GDK_WINDOW_HWND (window),
                           _gdk_win32_window_state_to_string (private->state),
-                          //(raise ? " raise" : ""),
+                          (raise ? " raise" : ""),
                           (deiconify ? " deiconify" : "")));
   
   /* If asked to show (not deiconify) an withdrawn and iconified
@@ -1102,7 +1102,8 @@ show_window_internal (GdkWindow *window,
 }
 
 static void
-gdk_win32_window_show (GdkWindow *window)
+gdk_win32_window_show (GdkWindow *window, 
+                      gboolean already_mapped)
 {
   show_window_internal (window, FALSE, FALSE);
 }
@@ -1431,195 +1432,6 @@ gdk_win32_window_reparent (GdkWindow *window,
   return FALSE;
 }
 
-static void
-erase_background (GdkWindow *window,
-                 HDC        hdc)
-{
-#if 0
-  HDC bgdc = NULL;
-  HBRUSH hbr = NULL;
-  HPALETTE holdpal = NULL;
-  RECT rect;
-  COLORREF bg;
-  GdkColormap *colormap;
-  GdkColormapPrivateWin32 *colormap_private;
-  int x, y;
-  int x_offset, y_offset;
-  
-  if (((GdkWindowObject *) window)->input_only ||
-      ((GdkWindowObject *) window)->bg_pixmap == GDK_NO_BG ||
-      GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) window)->impl)->no_bg)
-    {
-      return;
-    }
-
-  colormap = gdk_drawable_get_colormap (window);
-
-  if (colormap &&
-      (colormap->visual->type == GDK_VISUAL_PSEUDO_COLOR ||
-       colormap->visual->type == GDK_VISUAL_STATIC_COLOR))
-    {
-      int k;
-         
-      colormap_private = GDK_WIN32_COLORMAP_DATA (colormap);
-
-      if (!(holdpal = SelectPalette (hdc,  colormap_private->hpal, FALSE)))
-        WIN32_GDI_FAILED ("SelectPalette");
-      else if ((k = RealizePalette (hdc)) == GDI_ERROR)
-       WIN32_GDI_FAILED ("RealizePalette");
-      else if (k > 0)
-       GDK_NOTE (COLORMAP, g_print ("erase_background: realized %p: %d colors\n",
-                                    colormap_private->hpal, k));
-    }
-  
-  x_offset = y_offset = 0;
-  while (window && ((GdkWindowObject *) window)->bg_pixmap == GDK_PARENT_RELATIVE_BG)
-    {
-      /* If this window should have the same background as the parent,
-       * fetch the parent. (And if the same goes for the parent, fetch
-       * the grandparent, etc.)
-       */
-      x_offset += ((GdkWindowObject *) window)->x;
-      y_offset += ((GdkWindowObject *) window)->y;
-      window = GDK_WINDOW (((GdkWindowObject *) window)->parent);
-    }
-  
-  if (GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) window)->impl)->no_bg)
-    {
-      /* Improves scolling effect, e.g. main buttons of testgtk */
-      return;
-    }
-
-  GetClipBox (hdc, &rect);
-
-  if (((GdkWindowObject *) window)->bg_pixmap == NULL)
-    {
-      bg = _gdk_win32_colormap_color (GDK_DRAWABLE_IMPL_WIN32 (((GdkWindowObject *) window)->impl)->colormap,
-                                     ((GdkWindowObject *) window)->bg_color.pixel);
-      
-      if (!(hbr = CreateSolidBrush (bg)))
-       WIN32_GDI_FAILED ("CreateSolidBrush");
-      else if (!FillRect (hdc, &rect, hbr))
-       WIN32_GDI_FAILED ("FillRect");
-      if (hbr != NULL)
-       DeleteObject (hbr);
-    }
-  else if (((GdkWindowObject *) window)->bg_pixmap != GDK_NO_BG)
-    {
-      GdkPixmap *pixmap = ((GdkWindowObject *) window)->bg_pixmap;
-      GdkPixmapImplWin32 *pixmap_impl = GDK_PIXMAP_IMPL_WIN32 (GDK_PIXMAP_OBJECT (pixmap)->impl);
-      
-      if (x_offset == 0 && y_offset == 0 &&
-         pixmap_impl->width <= 8 && pixmap_impl->height <= 8)
-       {
-         if (!(hbr = CreatePatternBrush (GDK_PIXMAP_HBITMAP (pixmap))))
-           WIN32_GDI_FAILED ("CreatePatternBrush");
-         else if (!FillRect (hdc, &rect, hbr))
-           WIN32_GDI_FAILED ("FillRect");
-         if (hbr != NULL)
-           DeleteObject (hbr);
-       }
-      else
-       {
-         HGDIOBJ oldbitmap;
-
-         if (!(bgdc = CreateCompatibleDC (hdc)))
-           {
-             WIN32_GDI_FAILED ("CreateCompatibleDC");
-             return;
-           }
-         if (!(oldbitmap = SelectObject (bgdc, GDK_PIXMAP_HBITMAP (pixmap))))
-           {
-             WIN32_GDI_FAILED ("SelectObject");
-             DeleteDC (bgdc);
-             return;
-           }
-         x = -x_offset;
-         while (x < rect.right)
-           {
-             if (x + pixmap_impl->width >= rect.left)
-               {
-                 y = -y_offset;
-                 while (y < rect.bottom)
-                   {
-                     if (y + pixmap_impl->height >= rect.top)
-                       {
-                         if (!BitBlt (hdc, x, y,
-                                      pixmap_impl->width, pixmap_impl->height,
-                                      bgdc, 0, 0, SRCCOPY))
-                           {
-                             WIN32_GDI_FAILED ("BitBlt");
-                             SelectObject (bgdc, oldbitmap);
-                             DeleteDC (bgdc);
-                             return;
-                           }
-                       }
-                     y += pixmap_impl->height;
-                   }
-               }
-             x += pixmap_impl->width;
-           }
-         SelectObject (bgdc, oldbitmap);
-         DeleteDC (bgdc);
-       }
-    }
-#endif
-}
-
-static void
-gdk_win32_window_clear_area (GdkWindow *window,
-                            gint       x,
-                            gint       y,
-                            gint       width,
-                            gint       height,
-                            gboolean   send_expose)
-{
-  GdkWindowImplWin32 *impl;
-  GdkWindowObject *obj;
-
-  obj = GDK_WINDOW_OBJECT (window);
-  impl = GDK_WINDOW_IMPL_WIN32 (obj->impl);
-
-  if (!GDK_WINDOW_DESTROYED (window))
-    {
-      HDC hdc;
-      RECT rect;
-
-      hdc = GetDC (GDK_WINDOW_HWND (window));
-
-      if (!send_expose)
-       {
-         if (width == 0)
-           width = obj->width - x;
-         if (height == 0)
-           height = obj->height - y;
-         GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: %p: "
-                                  "%dx%d@%+d%+d\n",
-                                  GDK_WINDOW_HWND (window),
-                                  width, height, x, y));
-         IntersectClipRect (hdc, x, y, x + width, y + height);
-         erase_background (window, hdc);
-         GDI_CALL (ReleaseDC, (GDK_WINDOW_HWND (window), hdc));
-       }
-      else
-       {
-         /* The background should be erased before the expose event is
-            generated */
-         IntersectClipRect (hdc, x, y, x + width, y + height);
-         erase_background (window, hdc);
-         GDI_CALL (ReleaseDC, (GDK_WINDOW_HWND (window), hdc));
-
-         rect.left = x;
-         rect.right = x + width;
-         rect.top = y;
-         rect.bottom = y + height;
-
-         GDI_CALL (InvalidateRect, (GDK_WINDOW_HWND (window), &rect, TRUE));
-         UpdateWindow (GDK_WINDOW_HWND (window));
-       }
-    }
-}
-
 static void
 gdk_win32_window_raise (GdkWindow *window)
 {
@@ -2263,37 +2075,32 @@ gdk_win32_window_get_geometry (GdkWindow *window,
 }
 
 static gint
-gdk_win32_window_get_origin (GdkWindow *window,
-                            gint      *x,
-                            gint      *y)
-{
-  gint return_val;
-  gint tx = 0;
-  gint ty = 0;
-
-  if (!GDK_WINDOW_DESTROYED (window))
-    {
-      POINT pt;
-
-      pt.x = 0;
-      pt.y = 0;
-      ClientToScreen (GDK_WINDOW_HWND (window), &pt);
-      tx = pt.x;
-      ty = pt.y;
-      return_val = 1;
-    }
-  else
-    return_val = 0;
+gdk_win32_window_get_root_coords (GdkWindow *window,
+                                 gint       x,
+                                 gint       y,
+                                 gint      *root_x,
+                                 gint      *root_y)
+{
+  gint tx;
+  gint ty;
+  POINT pt;
+
+  pt.x = x;
+  pt.y = y;
+  ClientToScreen (GDK_WINDOW_HWND (window), &pt);
+  tx = pt.x;
+  ty = pt.y;
   
   if (x)
-    *x = tx + _gdk_offset_x;
+    *root_x = tx + _gdk_offset_x;
   if (y)
-    *y = ty + _gdk_offset_y;
+    *root_y = ty + _gdk_offset_y;
 
-  GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %p: %+d%+d\n",
+  GDK_NOTE (MISC, g_print ("gdk_window_get_root_coords: %p: %+d%+d %+d%+d\n",
                           GDK_WINDOW_HWND (window),
+                          x, y,
                           tx, ty));
-  return return_val;
+  return 1;
 }
 
 static gboolean
@@ -2301,7 +2108,7 @@ gdk_win32_window_get_deskrelative_origin (GdkWindow *window,
                                          gint      *x,
                                          gint      *y)
 {
-  return gdk_window_get_origin (window, x, y);
+  return gdk_win32_window_get_root_coords (window, 0, 0, x, y);
 }
 
 static void
@@ -2373,24 +2180,50 @@ gdk_window_get_frame_extents (GdkWindow    *window,
                           r.left, r.top));
 }
 
-GdkWindow*
-_gdk_windowing_window_get_pointer (GdkDisplay      *display,
-                                  GdkWindow       *window,
-                                  gint            *x,
-                                  gint            *y,
-                                  GdkModifierType *mask)
-{
-  GdkWindow *return_val;
-  POINT screen_point, point;
-  HWND hwnd, hwndc;
+
+static GdkModifierType
+get_current_mask (void)
+{
+  GdkModifierType mask;
   BYTE kbd[256];
 
-  g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
+  GetKeyboardState (kbd);
+  mask = 0;
+  if (kbd[VK_SHIFT] & 0x80)
+    mask |= GDK_SHIFT_MASK;
+  if (kbd[VK_CAPITAL] & 0x80)
+    mask |= GDK_LOCK_MASK;
+  if (kbd[VK_CONTROL] & 0x80)
+    mask |= GDK_CONTROL_MASK;
+  if (kbd[VK_MENU] & 0x80)
+    mask |= GDK_MOD1_MASK;
+  if (kbd[VK_LBUTTON] & 0x80)
+    mask |= GDK_BUTTON1_MASK;
+  if (kbd[VK_MBUTTON] & 0x80)
+    mask |= GDK_BUTTON2_MASK;
+  if (kbd[VK_RBUTTON] & 0x80)
+    mask |= GDK_BUTTON3_MASK;
+
+  return mask;
+}
+    
+static gboolean
+gdk_window_win32_get_pointer (GdkWindow       *window,
+                             gint            *x,
+                             gint            *y,
+                             GdkModifierType *mask)
+{
+  gboolean return_val;
+  POINT point;
+  HWND hwnd, hwndc;
+
+  g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), FALSE);
   
-  return_val = NULL;
-  GetCursorPos (&screen_point);
-  point = screen_point;
-  ScreenToClient (GDK_WINDOW_HWND (window), &point);
+  return_val = TRUE;
+
+  hwnd = GDK_WINDOW_HWND (window);
+  GetCursorPos (&point);
+  ScreenToClient (hwnd, &point);
 
   *x = point.x;
   *y = point.y;
@@ -2401,45 +2234,12 @@ _gdk_windowing_window_get_pointer (GdkDisplay      *display,
       *y += _gdk_offset_y;
     }
 
-  hwnd = WindowFromPoint (screen_point);
-  if (hwnd != NULL)
-    {
-      gboolean done = FALSE;
-      
-      while (!done)
-       {
-         point = screen_point;
-         ScreenToClient (hwnd, &point);
-         hwndc = ChildWindowFromPoint (hwnd, point);
-         if (hwndc == NULL)
-           done = TRUE;
-         else if (hwndc == hwnd)
-           done = TRUE;
-         else
-           hwnd = hwndc;
-       }
-      
-      return_val = gdk_window_lookup ((GdkNativeWindow) hwnd);
-    }
-  else
-    return_val = NULL;
-      
-  GetKeyboardState (kbd);
-  *mask = 0;
-  if (kbd[VK_SHIFT] & 0x80)
-    *mask |= GDK_SHIFT_MASK;
-  if (kbd[VK_CAPITAL] & 0x80)
-    *mask |= GDK_LOCK_MASK;
-  if (kbd[VK_CONTROL] & 0x80)
-    *mask |= GDK_CONTROL_MASK;
-  if (kbd[VK_MENU] & 0x80)
-    *mask |= GDK_MOD1_MASK;
-  if (kbd[VK_LBUTTON] & 0x80)
-    *mask |= GDK_BUTTON1_MASK;
-  if (kbd[VK_MBUTTON] & 0x80)
-    *mask |= GDK_BUTTON2_MASK;
-  if (kbd[VK_RBUTTON] & 0x80)
-    *mask |= GDK_BUTTON3_MASK;
+  hwndc = ChildWindowFromPoint (hwnd, point);
+  if (hwndc != NULL && hwndc != hwnd &&
+      !gdk_win32_handle_table_lookup ((GdkNativeWindow) hwndc))
+    return_val = FALSE; /* Direct child unknown to gdk */
+
+  *mask = get_current_mask ();
   
   return return_val;
 }
@@ -2451,10 +2251,16 @@ _gdk_windowing_get_pointer (GdkDisplay       *display,
                            gint             *y,
                            GdkModifierType  *mask)
 {
+  POINT point;
+
   g_return_if_fail (display == _gdk_display);
   
   *screen = _gdk_screen;
-  _gdk_windowing_window_get_pointer (_gdk_display, _gdk_root, x, y, mask);
+  GetCursorPos (&point);
+  *x = point.x + _gdk_offset_x;
+  *y = point.y + _gdk_offset_y;
+
+  *mask = get_current_mask ();
 }
 
 void
@@ -3706,7 +3512,7 @@ gdk_window_configure_finished (GdkWindow *window)
 }
 
 void
-gdk_window_beep (GdkWindow *window)
+_gdk_windowing_window_beep (GdkWindow *window)
 {
   gdk_display_beep (_gdk_display);
 }
@@ -3848,7 +3654,8 @@ gdk_window_impl_iface_init (GdkWindowImplIface *iface)
   iface->reparent = gdk_win32_window_reparent;
   iface->set_cursor = gdk_win32_window_set_cursor;
   iface->get_geometry = gdk_win32_window_get_geometry;
-  iface->get_origin = gdk_win32_window_get_origin;
+  iface->get_pointer = gdk_window_win32_get_pointer;
+  iface->get_root_coords = gdk_win32_window_get_root_coords;
   iface->shape_combine_region = gdk_win32_window_shape_combine_region;
   iface->input_shape_combine_region = gdk_win32_input_shape_combine_region;
   iface->get_deskrelative_origin = gdk_win32_window_get_deskrelative_origin;
index ca8d8e5decad2a4b59d8750d057460038d480043..06a0ef45e8581fdb5ce33a0380192f62ed18caef 100644 (file)
@@ -1,5 +1,7 @@
 #include <gtk/gtk.h>
+#ifdef GDK_WINDOWING_X11
 #include <X11/Xlib.h>
+#endif
 
 static GtkWidget *darea;
 static GtkTreeStore *window_store = NULL;